#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXTAM 3
#define erro 0.01

void imprimeMatriz(float matriz[MAXTAM][MAXTAM],float vetor[MAXTAM]);
void iniciaResposta(float resposta1[MAXTAM], float resposta2[MAXTAM]);
float maior_valor(float vetor[MAXTAM]);

int main(){

	float matriz[MAXTAM][MAXTAM];
	float resultado_sistema[MAXTAM];
	float resposta1[MAXTAM];
    	float resposta2[MAXTAM];
	float aux[MAXTAM];
	float valor_entrada = 0;
	float vetor_aux[MAXTAM];
	float max = 0;
	float maxResp = 0;
	float aux2 = 0;
	float aux3 = 0;
	float erro_calcu = 0;
	int lin_max = 0;
	int i;
	int j;
	int k;
	int contador;
	int iteracao = 0;


    //iniciaResposta(&resposta1[MAXTAM],&resposta2[MAXTAM]);
    for(i = 0; i < MAXTAM; i++){
        resposta1[i] = 0;
        resposta2[i] = 0;
    }


	printf("Entre com os coeficientes do sistema\n");

	for(i = 0; i < MAXTAM; i++)
		for(j = 0; j < MAXTAM; j++){
			scanf("%f",&valor_entrada);
			matriz[i][j] = valor_entrada;
		}

	printf("Entre com os resultados das equações\n");

	for(i = 0; i < MAXTAM; i++){
		scanf("%f",&valor_entrada);
		resultado_sistema[i] = valor_entrada;
	}


    contador = MAXTAM;

	for(i = 0; i < MAXTAM; i++){
		for(j = (MAXTAM-contador); j < MAXTAM; j++){
			if(max < matriz[j][i]){
				max = matriz[j][i];
				lin_max = j;
            }
		}


		if( lin_max != 0){
			for(k = 0; k < MAXTAM; k++){
				aux[k] = matriz[MAXTAM-contador][k];
				matriz[MAXTAM-contador][k] = matriz[lin_max][k];
				matriz[lin_max][k] = aux[k];
			}
			aux2 = resultado_sistema[MAXTAM-contador];
			resultado_sistema[MAXTAM-contador] = resultado_sistema[lin_max];
			resultado_sistema[lin_max] = aux2;

		}
		max = 0;
		contador--;
		//imprimeMatriz(matriz,resultado_sistema);
	}

    //motando a matriz para utilizar na e equação Xk+1 = -matriz*Xk + b(resultado sistema

    for(i = 0; i < MAXTAM; i++){
        aux3 = matriz[i][i];
        resultado_sistema[i] = resultado_sistema[i]/matriz[i][i];
		for(j = 0; j < MAXTAM; j++){
		    matriz[i][j] = matriz[i][j]/aux3;
		}
		matriz[i][i] = 0;
    }
    imprimeMatriz(matriz,resultado_sistema);

    // Sistema, calculando Xk+1 até achar erro_calc menor que 0.00001;

    do{
        for(k = 0; k < MAXTAM; k++)
            resposta2[k] = 0;
        for(i = 0; i < MAXTAM; i++){
            for(j = 0; j < MAXTAM; j++){

                    resposta2[i] += matriz[i][j]*resposta1[j];

                    }

            resposta2[i] = resultado_sistema[i] - resposta2[i];



            // diferença entre seidel e jacob, resposta1 vai recebendo o resultado de resposta2

        }


        for(i = 0; i < MAXTAM; i++)
            printf("k %f ",resposta1[i]);

        printf("\n");

        for(i = 0; i < MAXTAM; i++)
            printf("k+1 %f ",resposta2[i]);

        printf("\n");

        for(i = 0; i < MAXTAM; i++)
            vetor_aux[i] = resposta2[i]-resposta1[i];

        max = maior_valor(vetor_aux);
        maxResp = maior_valor(resposta2);
        erro_calcu = (max/maxResp);

	printf("max %f    maxresp %f    erro_calc %f\n",max,maxResp,erro_calcu);

        for(i = 0; i < MAXTAM; i++)
            resposta1[i] = resposta2[i];

        iteracao++;
    }while(erro_calcu > erro);

    for(i = 0; i < MAXTAM; i++)
        printf("\nX%d = %f\n",i,resposta2[i]);
    printf("Numero de iteracoes foi %d\n", iteracao);

return 0;
}

void imprimeMatriz(float matriz[MAXTAM][MAXTAM],float vetor[MAXTAM]){
    int i = 0;
    int j =0;
    printf("Imprimindo...\n");
	for(i = 0; i < MAXTAM; i++){
		for(j = 0; j < MAXTAM; j++){
			printf("%f ",matriz[i][j]);
		}
		printf(" %f",vetor[i]);
		printf("\n");
	}
}

void iniciaResposta(float resposta1[MAXTAM], float resposta2[MAXTAM]){
    int i = 0;
    for(i = 0; i < MAXTAM; i++){
        resposta1[i] = 0;
        resposta2[i] = 0;
    }
}

float maior_valor(float vetor[MAXTAM]){
    int i = 0;
    float max = fabs(vetor[0]);
    for(i = 0; i < MAXTAM; i++){
        if(max < fabs(vetor[i]))
            max = fabs(vetor[i]);
    }
return max;
}
